Correctly dispose (again) the managed/native object relationship #1344
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description of Change
This PR fine tunes the disposal steps of a co-owned object pair. There are a few scenarios:
SKBitmap)When the managed object is disposed, destroy the native object.
SKSurfacecontrolsSKCanvas)When then the managed object destroys the native surface, the native canvas is also destroyed. There may be a case where a brand new native canvas is constructed in the same place - before the managed canvas is disposed. We have to make sure that e dispose the managed object before we destroy the native object.
SKSvgCanvascontrolsSKManagedStream)The managed object creates the native object, but the native object owns the managed object. This means that even when the managed object is disposed, the action is "ignored" and proxied to the native destructor - which will then call back into managed code to dispose the managed object. This is because the native canvas may flush or write closing data into the managed stream.
Scenarios 2 and 3 cause an issue: In one case, the managed
SKCanvasneeds to be destroyed before destroying the nativeSkSurface. On the other hand, the nativeSKSvgCanvasneeds to be destroyed before destroying the managedSKManagedStream. So which goes first?The answer is in the ownership of the handle: In scenario 1, the surface owns its handle and the canvas - which does not own its handle. In scenario 2, the canvas owns its handle and the stream - which does own its handle.
This shows that we need to first dispose all the "reference-only" objects - or the ones that do not own their handle. Then dispose the native object. Finally, clean up any managed objects.
Bugs Fixed
API Changes
None.
Behavioral Changes
See description...
PR Checklist